package com.xli.security.crypto.util;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SM4;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SM4Util {

    public static String INIT_KEY = "xli@sm4.safety";
    public static String INIT_IV = "xli.vi@sm4.safety";

    public static String encrypt(String plainText) {
        return encrypt(plainText, INIT_KEY, INIT_IV);
    }

    public static String encrypt(String plainText, String key, String iv) {
        // 将密钥和 IV 从 Base64 解码为字节数组
        byte[] keyByte = generateKey(key);
        byte[] ivByte = generateIv(iv);

        // 初始化 SM4 加密器（CBC 模式 + PKCS5Padding）
        SM4 sm4 = new SM4(Mode.CBC, Padding.PKCS5Padding, keyByte, ivByte);
        return sm4.encryptBase64(plainText);
    }

    public static String decrypt(String plainText) {
        return decrypt(plainText, INIT_KEY, INIT_IV);
    }

    public static String decrypt(String plainText, String key, String iv) {
        // 将密钥和 IV 从 Base64 解码为字节数组
        byte[] keyByte = generateKey(key);
        byte[] ivByte = generateIv(iv);

        // 初始化 SM4 加密器（CBC 模式 + PKCS5Padding）
        SM4 sm4 = new SM4(Mode.CBC, Padding.PKCS5Padding, keyByte, ivByte);
        return sm4.decryptStr(plainText);
    }

    private static byte[] generateKey(String key) {
        if (key == null || StrUtil.isEmpty(key)) {
            key = INIT_KEY;
        }
        return Base64.decode(key);
    }

    private static byte[] generateIv(String iv) {
        if (iv == null || StrUtil.isEmpty(iv)) {
            iv = INIT_IV;
        }
        return Base64.decode(iv);
    }
}